﻿package stuff3D.objects.primitives
{
	import flash.geom.Point;
	import flash.geom.Vector3D;
	import stuff3D.meshes.Triangle;
	import stuff3D.meshes.Mesh;
	
	public class Plane extends Mesh
	{
		public var nb_dots_largeur:uint=11;
		public var pas_largeur:uint = 40;
		public var nb_dots_hauteur:uint = 9;
		public var pas_hauteur:uint = 40;
		
		public var vertices_ground:Vector.<Vector3D>;
		
		public function Plane( _nb_dots_largeur:uint=12, _nb_dots_hauteur:uint=8, y_array:Array=null ):void 
		{
			nb_dots_largeur = _nb_dots_largeur;
			_nb_dots_hauteur = _nb_dots_hauteur;
			populate( y_array );
		}
		private function populate( y_array:Array=null ):void 
		{
			var index:int = 0;
			
			vertices_ground = new Vector.<Vector3D>();
			vertices = new Vector.<Vector3D>();
			triangles = new Vector.<Triangle>();
			uvdots = new Vector.<Point>;
		
			for ( var i:int = 0; i < nb_dots_largeur; i++ )
			{
				var u:Number = i / ( nb_dots_largeur - 1 );
				for ( var j:int = 0; j < nb_dots_hauteur; j++ )
				{
					var v:Number = j / ( nb_dots_hauteur - 1 );
					
					uvdots.push( new Point( u, v ) );
					
					var vc3D:Vector3D = new Vector3D( i * pas_largeur - (nb_dots_largeur - 1) * pas_largeur / 2, 0, j * pas_hauteur - (nb_dots_hauteur - 1) * pas_hauteur / 2, 0 );
					
					vertices_ground.push( vc3D );
					
					if ( y_array ) vc3D.y = y_array[ index ];
					
					vertices.push( vc3D );
					
					if ( i != ( nb_dots_largeur -1) && j != ( nb_dots_hauteur  -1) )
					{
						var t:int = i * nb_dots_hauteur + j;
						
						triangles.push( new Triangle( t, t + nb_dots_hauteur + 1, t + 1, t, t + nb_dots_hauteur + 1, t + 1 ) );
						triangles.push( new Triangle( t, t + nb_dots_hauteur, t + nb_dots_hauteur + 1, t, t + nb_dots_hauteur, t + nb_dots_hauteur + 1 ) );
					}
					index++;
				}				
			}
		}
		override public function get info():String
		{
			var s:String = "";
			s += nb_dots_largeur + file_delimiter1;
			s += nb_dots_hauteur + file_delimiter1;
			for each( var mDot:Vector3D in vertices ) s += mDot.y + file_delimiter2;
			return s;
		}
		override public function set info(s:String):void
		{
			var arrayFile:Array = s.split( file_delimiter1 );
			nb_dots_largeur = arrayFile[ 0 ];
			nb_dots_hauteur = arrayFile[ 1 ];
			populate( arrayFile[ 2 ].split( file_delimiter2 ) );
		}
	}
	
}